package com.wshoto.ocean.feign.client;

import com.wshoto.framework.common.base.*;
import com.wshoto.ocean.feign.client.fallback.factory.*;
import com.wshoto.ocean.feign.common.dto.*;
import com.wshoto.ocean.feign.common.request.*;
import org.springframework.cloud.openfeign.*;
import org.springframework.validation.annotation.*;
import org.springframework.web.bind.annotation.*;

/**
 * Feign接口示例
 * name为当前服务名，尽量定义为常量调用
 * path为Feign接口提供方服务访问根路径
 * fallback指向抽象AbstractAppServiceFeignFallBack，方便开发者覆写该抽象类，定义自己的FallBack实现
 * 接口命名规范遵循大驼峰式命名，后缀统一以ServiceFeign结尾
 * 请求规范遵循Restfull规范
 *
 * @author Lee
 */
@FeignClient(name = "app-server", contextId = "appServiceFeign", fallbackFactory = AppServiceFeignFallBackFactory.class)
public interface AppServiceFeign {

    /**
     * 接口请求路径规范建议为 /feign/当前接口类名/当前方法名
     * 多参数有返回值示例
     * 返回值类型统一为Result<String>类型，返回值调用ResultUtils.serializeSuccess(obj)进行封装，只对载荷部分进行序列化
     * 与API接口定义不同，Api接口是用与前端调用，因此返回完整的Json字符串即可
     * 而Feign接口是用于服务端调用，虽然最终的数据结构一致，但如此定义会使得调用方少解析一层数据，方便使用
     * 参数接收方式为Json请求接收，@RequestBody
     *
     * @param appReq
     * @return
     * @Validated校验参数，校验结果会通过全局异常拦截返回,不必做任何处理
     */
    @PostMapping("/feign/appServer/getApps")
    Result<AppInfoListDTO> getApps(@RequestBody @Validated AppReq appReq);

    /**
     * 接口请求路径规范建议为 /feign/当前接口类名/当前方法名
     * 单参数有返回值示例
     * 返回值类型统一为Result<String>类型，返回值调用ResultUtils.serializeSuccess(obj)进行封装，只对载荷部分进行序列化
     * 与API接口定义不同，Api接口是用与前端调用，因此返回完整的Json字符串即可
     * 而Feign接口是用于服务端调用，虽然最终的数据结构一致，但如此定义会使得调用方少解析一层数据，方便使用
     * 参数接收方式为路径接收，Restfull风格url,Feign中使用@PathVariable一定要用value=""标明对应的参数
     *
     * @param appId
     * @return
     */
    @GetMapping("/feign/appServer/getAppById/{appId}")
    Result<AppInfoDTO> getAppById(@PathVariable(value = "appId") Long appId);

    /**
     * 接口请求路径规范建议为 /feign/当前接口类名/当前方法名
     * 多参数无返回值示例
     * 返回值类型统一为Result<String>类型，执行完业务逻辑层代码直接返回ResultUtils.success()
     * 与API接口定义不同，Api接口是用与前端调用，因此返回完整的Json字符串即可
     * 而Feign接口是用于服务端调用，虽然最终的数据结构一致，但如此定义会使得调用方少解析一层数据，方便使用
     * 参数接收方式为Json请求接收，@RequestBody
     *
     * @param appRegisterReq
     * @return
     * @Validated校验参数，校验结果会通过全局异常拦截返回,不必做任何处理
     */
    @PutMapping("/feign/appServer/appRegister")
    Result<String> appRegister(@RequestBody @Validated AppRegisterReq appRegisterReq);

    /**
     * 接口请求路径规范建议为 /feign/当前接口类名/当前方法名
     * 单参数无返回值示例
     * 返回值类型统一为Result<String>类型，执行完业务逻辑层代码直接返回ResultUtils.success()
     * 与API接口定义不同，Api接口是用与前端调用，因此返回完整的Json字符串即可
     * 而Feign接口是用于服务端调用，虽然最终的数据结构一致，但如此定义会使得调用方少解析一层数据，方便使用
     * 参数接收方式为路径接收，Restfull风格url,,Feign中使用@PathVariable一定要用value=""标明对应的参数
     *
     * @param appId
     * @return
     */
    @DeleteMapping("/feign/appServer/deleteApp/{appId}")
    Result<String> deleteApp(@PathVariable(value = "appId") Long appId);

}
